722. 删除注释

722. 删除注释

Similar Question

Solution Tips

方案一: 模拟

var removeComments = function(source) {
    // 对于 行注释, 直接 slice 就行
    // 对于 块级注释, 可以使用栈? 没必要吧, 又不会嵌套, 直接找到非重叠的块注释作为结束就好了
    // 可以简化到一行处理, 这样无论是行级还是块级处理的逻辑都是相同的
    let isInsideBlock = false;
    for (let i = 0; i < source.length; i++) {
        const line = source[i];
        let start = 0;
        let end = line.length;
        if (isInsideBlock) {
            // 在块注释内部, 默认整行删除, 除非找到了闭合
            end = 0;
        }
        for (let j = 0; j < line.length; j++) {
            const char = line[j];

            if (char === '/') {
                if (!isInsideBlock) {
                    // 不在块注释内部, 寻找下一个字符, 判断是行还是块
                    const nextChar = line[j + 1] || '';
                    if (nextChar === '*') {
                        isInsideBlock = true;
                        // 块级的第一行, 从这里结束
                        end = j;
                    }
                    else if (nextChar === '/') {
                        // 行级注释, 直接截断即可
                        end = j;
                    }
                }
                else {
                    // 除非找到了闭合
                    const prevChar = line[j - 1] || '';
                    if (prevChar === '*') {
                        isInsideBlock = false;
                        // 块级的最后一行, 从这里开始
                        start = j + 1;
                        end = line.length;
                        // 换行符都被删除了, 需要进行拼接行
                        // 还是当成一行来做就好, 这样直接删除换行符就处理好了
                    }
                }
            }
        }
        source[i] = line.slice(start, end);
    }

    return source.filter((line) => line);
};
// console.log(removeComments(["/*Test program */", "int main()", "{ ", "  // variable declaration ", "int a, b, c;", "/* This is a test", "   multiline  ", "   comment for ", "   testing */", "a = b + c;", "}"]))
console.log(removeComments(["a/*comment", "line", "more_comment*/b"]))

官方题解

Loading Question... - 力扣(LeetCode)

方案二: 单行正则

先转化为一行, 然后用正则直接匹配所有的注释, 替换为空串

String.join("\n", source).replaceAll("//.*|/\\*(.|\n)*?\\*/", "").split("\n")).filter(e -> (e.length() > 0)